
#ifndef __PACKAGE_UNPACKAGE_HPP__
#define __PACKAGE_UNPACKAGE_HPP__


#include <iostream>
#include <string>


const std::string protocal_sep = "|";
const size_t protocal_sep_len = protocal_sep.size();

// 添加报头
std::string Encode(const std::string &content)
{   
    // 1 + 1 -----> 5|1 + 1| ,  2 1 -----> 3|2 1|
    std::string package = std::to_string(content.size()) + protocal_sep + content + protocal_sep;
    return package;
}

// 将报头与有效载荷分离
// 要能够判断是否是一个完整的报文
bool Decode(std::string &package , std::string& content) // content是一个输出型参数
{
    size_t sep_pos = package.find(protocal_sep);

    if(sep_pos == std::string::npos) 
        return false;   // 不是完成的报文
    std::string len_str = package.substr(0 , sep_pos); 
    size_t len = std::stoi(len_str);
    size_t message_len = len + len_str.size() + 2*protocal_sep_len;  // 这个完整报文的长度
    if(message_len > package.size()) 
        return false;  // 不包含完成的报文,只包含一部分

    // 将报文从字符串中取下来
    content = package.substr(sep_pos + protocal_sep_len , len);
    package.erase(0 , message_len);                
    return true;
}



#endif 